<?php

/* 
 * Copyright (C) 2007 Revodes <http://www.revodes.com/>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */

class Torrent {
	private $core;
	
	function Torrent($core) {
		
	}

	/* Benc Functions, Taken from TBSource
	 * Modified for PHP Torrent */

	function benc($obj) {
		if (!is_array($obj) || !isset($obj["type"]) || !isset($obj["value"]))
			return;
		$c = $obj["value"];
		switch ($obj["type"]) {
			case "string":
				return $this->benc_str($c);
			case "integer":
				return $this->benc_int($c);
			case "list":
				return $this->benc_list($c);
			case "dictionary":
				return $this->benc_dict($c);
			default:
				return;
		}
	}
	
	function benc_str($s) {
		return strlen($s) . ":$s";
	}
	
	function benc_int($i) {
		return "i" . $i . "e";
	}
	
	function benc_list($a) {
		$s = "l";
		foreach ($a as $e) {
			$s .= $this->benc($e);
		}
		$s .= "e";
		return $s;
	}
	
	function benc_dict($d) {
		$s = "d";
		$keys = array_keys($d);
		sort($keys);
		foreach ($keys as $k) {
			$v = $d[$k];
			$s .= $this->benc_str($k);
			$s .= $this->benc($v);
		}
		$s .= "e";
		return $s;
	}
	
	function bdec_file($f, $ms) {
		$fp = fopen($f, "rb");
		if (!$fp)
			return;
		$e = fread($fp, $ms);
		fclose($fp);
		return $this->bdec($e);
	}
	
	function bdec($s) {
		if (preg_match('/^(\d+):/', $s, $m)) {
			$l = $m[1];
			$pl = strlen($l) + 1;
			$v = substr($s, $pl, $l);
			$ss = substr($s, 0, $pl + $l);
			if (strlen($v) != $l)
				return;
			return array(type => "string", value => $v, strlen => strlen($ss), string => $ss);
		}
		if (preg_match('/^i(\d+)e/', $s, $m)) {
			$v = $m[1];
			$ss = "i" . $v . "e";
			if ($v === "-0")
				return;
			if ($v[0] == "0" && strlen($v) != 1)
				return;
			return array(type => "integer", value => $v, strlen => strlen($ss), string => $ss);
		}
		switch ($s[0]) {
			case "l":
				return $this->bdec_list($s);
			case "d":
				return $this->bdec_dict($s);
			default:
				return;
		}
	}
	
	function bdec_list($s) {
		if ($s[0] != "l")
			return;
		$sl = strlen($s);
		$i = 1;
		$v = array();
		$ss = "l";
		for (;;) {
			if ($i >= $sl)
				return;
			if ($s[$i] == "e")
				break;
			$ret = $this->bdec(substr($s, $i));
			if (!isset($ret) || !is_array($ret))
				return;
			$v[] = $ret;
			$i += $ret["strlen"];
			$ss .= $ret["string"];
		}
		$ss .= "e";
		return array(type => "list", value => $v, strlen => strlen($ss), string => $ss);
	}
	
	function bdec_dict($s) {
		if ($s[0] != "d")
			return;
		$sl = strlen($s);
		$i = 1;
		$v = array();
		$ss = "d";
		for (;;) {
			if ($i >= $sl)
				return;
			if ($s[$i] == "e")
				break;
			$ret = $this->bdec(substr($s, $i));
			if (!isset($ret) || !is_array($ret) || $ret["type"] != "string")
				return;
			$k = $ret["value"];
			$i += $ret["strlen"];
			$ss .= $ret["string"];
			if ($i >= $sl)
				return;
			$ret = $this->bdec(substr($s, $i));
			if (!isset($ret) || !is_array($ret))
				return;
			$v[$k] = $ret;
			$i += $ret["strlen"];
			$ss .= $ret["string"];
		}
		$ss .= "e";
		return array(type => "dictionary", value => $v, strlen => strlen($ss), string => $ss);
	}
}

?>